package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.vo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
//@Transactional //当前类中的所有方法都受事务控制,增删改时需要事务,而查询不需要
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.selectList(null);
    }


    /**
     * 需求:
     * 1.根据用户名和密码查询数据库
     * 2.将密码进行加密处理md5加密方式
     * 3.如果用户名和密码正确 返回token
     * 4.独一无二的字符串 UUID
     * @param user
     * @return
     */
    @Override
    public String login(@RequestBody User user) {
        //1将明文密码进行md5加密(因为数据库中存储的密码是加密的密码,所以需要用加密的密码进行查询)
         String password=user.getPassword();
         byte [] bytes=password.getBytes();
         String md5pass=DigestUtils.md5DigestAsHex(bytes);
        //2.根据密码和姓名查询出user对象
         user.setPassword(md5pass);
         QueryWrapper<User> queryWrapper=new QueryWrapper<>(user);
         User selectOne = userMapper.selectOne(queryWrapper);
        //3.根据查询的user对象的有无进行返回值判断
        if(selectOne==null) return null;
        //4.若查询成功时需要返回唯一的token标识符提供给前端进行校验
        String token=UUID.randomUUID().toString().replace("-", "");
        return token;
    }


//    @Override
//    public PageResult list(PageResult pageResult) {
//         Integer start=(pageResult.getPageNum()-1) * pageResult.getPageSize();
//         Integer size=pageResult.getPageSize();
//         List<User> userList=userMapper.findUserListByPage(start, size);
//         long total=userMapper.selectCount(null);
//        return pageResult.setRows(userList).setTotal(total);
//    }

     //以MP的方式进行分页查询
    /**
     * @param pageResult
     * @return
     */
    @Override
    public PageResult list(PageResult pageResult) {
        Page<User> page=new Page(pageResult.getPageNum(),pageResult.getPageSize());
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        //当username为空时,也会拼接到sql语句中的where中,因此需要动态sql
        //用来判断用户是否传参
        boolean flag= StringUtils.hasLength(pageResult.getQuery());
        queryWrapper.like(flag,"username", pageResult.getQuery());
        //mp的分页查询方法
        //规则:page2个参数根据分页查询返回 total/分页后的记录4个参数
        page = userMapper.selectPage(page, queryWrapper);
        //根据分页对象获取想要的数据
        List<User> userList=page.getRecords();
        long total=page.getTotal();//mp方法给自动查询
        return pageResult.setTotal(total).setRows(userList);
    }

    @Override
    @Transactional
    public void changeStatus(User user) {
        userMapper.updateById(user);
    }


    /**
     * 每张表都含有创造事件和更新时间,不能每次都去创建,影响开发效率,进行优化,自动填充:
     *  MP实现数据的自动填充
     * @param user
     */
    @Override
    @Transactional
    public void addUser(User user) {
        String password=user.getPassword();
        byte[] bytes=password.getBytes();
        String md5pass=DigestUtils.md5DigestAsHex(bytes);
        //Date date=new Date();
        //user.setPassword(md5pass).setStatus(true).setCreated(date).setUpdated(date);
        //自动填充
        userMapper.insert(user);
    }

    @Override
    public User selectById(Integer id) {
        return userMapper.selectById(id);
    }

    @Override
    @Transactional
    public void updateUser(User user) {
        userMapper.updateById(user);
    }


    /**
     *关于Spring中的事务策略说明
     * 0.Spring内部有事务的管理器，默认开启.
     * 1.Spring只负责拦截运行时异常.
     *       异常类型: 1.运行时异常惇
     *               2.检查异常/编译异常由程序员自己控制
     * 2.属性1: rollbackFor可以配置特殊的异常类型.则可以控制事务.
     *   属性2: noRollbackFor可以配置异常类型遇到某种异常不回滚.
     * @param id
     */
    @Override
    @Transactional   //Spring默认提供的事务控制的注解
    public void deleteById(Integer id) {
        userMapper.deleteById(id);
    }

}
